package com.jsbs.iam.user.mapper;

import com.jsbs.iam.user.dto.UserInfoAddDto;
import com.jsbs.iam.user.dto.UserInfoDeleteDto;
import com.jsbs.iam.user.dto.UserInfoSelectDto;
import com.jsbs.iam.user.entity.IamUserInfo;
import com.jsbs.iam.user.entity.IamUserTypeBase;
import com.jsbs.iam.user.entity.IamUserTypeExtended;
import com.jsbs.iam.user.entity.IamUserTypeExtendedField;
import com.jsbs.iam.user.param.IamQueryUserByOrgParam;
import com.jsbs.iam.user.param.IamUserInfoParam;
import com.jsbs.iam.user.param.UserQueryParam;
import com.jsbs.iam.user.vo.IamUserGroupDynamicFilterRuleVo;
import com.jsbs.iam.user.vo.UserInfoSelectVo;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Mapper
@Repository
public interface UserInfoMapper {
    /**
     * 功能描述：统计手机号
     * @param companyCode
     * @param dataSource
     * @param userId
     * @param phone
     * @param employeeCode
     * @return
     */
    int countForUser(@Param("companyCode") String companyCode, @Param("dataSource") String dataSource, @Param("userId") String userId, @Param("phone") String phone, @Param("employeeCode") String employeeCode);

    /**
     * 功能描述：批量新增用户信息
     * @param userInfoDtoList
     */
    void batchInsert(@Param("list") List<IamUserInfo> userInfoDtoList);

    /**
     * 功能描述：批量更新用户信息
     * @param updateList
     */
    void batchUpdate(@Param("list") List<IamUserInfo> updateList);

    /**
     * 功能描述：获取当前用户ID最大值
     * @return
     */
    Integer getMaxUserCode();

    /**
     * 功能描述：批量更新账户标识，更新为已开通
     * @param userCodes
     */
    void updateByUserCode(@Param("list") List<String> userCodes);

    /**
     * 功能描述：角色关联用户查询-——查询某个角色下绑定的用户
     * @param
     * @return
     */
    List<IamUserInfo> queryRoleBindUsers(@Param("employeeCode")String employeeCode,
                                         @Param("name")String name,
                                         @Param("userCodes")List<String> userCodes);

    /**
     * 功能描述：查询非用户id范围中的 用户信息
     * @param
     * @return
     */
    List<IamUserInfo> queryRoleNotBindUsers(@Param("employeeCode")String employeeCode,
                                  @Param("name")String name,
                                  @Param("userCodes")List<String> userCodes);

    /**
     * 功能描述：根据用户编码（usercode工号）,开通账号
     * @param userCode
     * @return
     */
    boolean openAccount(@Param("userCode")List<String> userCode);

    /**
     * 根据用户id查询角色编码
     * @param userCode
     * @return
     */
    List<String> getRoleCode (@Param("userCode") String userCode);

    /**
     * 功能描述：根据用户编码（usercode）,批量将用户设置为未开通
     * @param userCode
     * @return
     */
    int batchDeleteByUserCode(@Param("userCode")List<String> userCode);

    /**
     * 查询组织下用户数量
     *
     * @param orgTypeCode
     * @param orgCode
     * @param companyCode
     * @return
     */
    int getUserCount(@Param("orgTypeCode")String orgTypeCode, @Param("orgCode")String orgCode, @Param("companyCode")String companyCode);

    /**
     * 功能描述：查询用户信息
     * @param userQueryParam
     * @return
     */
    List<IamUserInfo> queryUserByParam(@Param("queryParam") UserQueryParam userQueryParam);

    List<IamUserInfo> queryUserNotOpen(@Param("queryParam")UserQueryParam userQueryParam);

    /**
     * 功能描述：获取绑定用户列表
     * @param userQueryParam
     * @return
     */
    List<IamUserInfo> queryBindUser(@Param("queryParam") UserQueryParam userQueryParam);

    /**
     * 获取用户类型扩展字段数据
     *
     * @param userTypeCode
     * @param companyCode
     * @return
     */
    List<IamUserTypeExtendedField> getUserTypeExtend(@Param("userTypeCode")String userTypeCode, @Param("companyCode")String companyCode);

    /**
     * 校验同一组织类型下只能有一个手机号
     *
     * @param orgTypeCode
     * @param phone
     * @param companyCode
     * @return
     */
    int verifyPhone(@Param("orgTypeCode")String orgTypeCode, @Param("phone")String phone, @Param("companyCode")String companyCode);

    /**
     * 校验用户编码的唯一性
     * @param employeeCode
     * @return
     */
    int verifyEmployeeCode(@Param("employeeCode")String employeeCode);

    /**
     * 获取用户编码
     * @return
     */
    String selectEmployeeCode(@Param("companyCode")String companyCode);

    /**
     * 添加用户主数据
     * @param userInfoAddDto
     */
    void addUserInfoMain(@Param("userInfoAddDto") UserInfoAddDto userInfoAddDto);

    /**
     * 保存扩展字段数据
     * @param fieldMap
     */
    void insetExtendInfo(@Param("fieldMap")List<Map<String, String>> fieldMap);

    /**
     * 根据条件查询用户数据
     * @param userInfoSelectDto
     * @return
     */
    List<UserInfoSelectVo> selectUserInfo(@Param("userInfoSelectDto") UserInfoSelectDto userInfoSelectDto);

    /**
     * 批量删除用户数据
     * @param userInfoDeleteDto
     */
    void deleteUserInfo(@Param("userInfoDeleteDto") UserInfoDeleteDto userInfoDeleteDto);

    /**
     * 根据用户唯一标识用户id查询用户主数据
     *
     * @param userCode
     * @param companyCode
     * @return
     */
    IamUserInfo selectUserMainData(@Param("userCode") String userCode, @Param("companyCode") String companyCode);

    /**
     * 根据唯一标识用户id查询用户扩展字段数据
     *
     * @param userCode
     * @param companyCode
     * @return
     */
    @MapKey("id")
    List<Map<String, String>> selectUserExtendedData(@Param("userCode") String userCode,@Param("companyCode") String companyCode);

    /**
     * 更新用户主数据
     * @param userInfoAddDto
     */
    void updateUserMainData(@Param("userInfoAddDto") UserInfoAddDto userInfoAddDto);

    /**
     * 更新用户扩展字段数据
     * @param fieldMap
     */
    void updateUserExtendedData(@Param("fieldMap") List<Map<String, String>> fieldMap);

    /**
     * 根据组织编码查询组织类型
     *
     * @param orgCodes
     * @param companyCode
     * @return
     */
    List<String> verifyOrgType(@Param("orgCodes") List<String> orgCodes, @Param("companyCode") String companyCode);

    /**
     * 根据组织编码获取组织名称
     *
     * @param orgCodes
     * @param companyCode
     * @return
     */
    List<String> getOrgNames(@Param("orgCodes") List<String> orgCodes, @Param("companyCode")String companyCode);


    /**
     * 根据岗位编码获取岗位名称
     *
     * @param postIds
     * @param companyCode
     * @return
     */
    List<String> getPostNames(@Param("postIds")List<String> postIds, @Param("companyCode")String companyCode);

    /**
     * 功能描述：根据 手机+组织类型编码+租户编码 查询是否存在该用户
     * @param iamUserInfoParam
     * @return IamUserInfo
     */
    IamUserInfo getUserInfoByAny(@Param("iamUserInfoParam")IamUserInfoParam iamUserInfoParam);

    /**
     * 查询所有用户类型数据
     * @return
     */
    List<IamUserTypeBase> getUserType(@Param("companyCode")String companyCode);

    /**
     * 批量插入用户数据
     * @param importList
     */
    void insetUserInfoList(@Param("importList") List<UserInfoAddDto> importList);

    /**
     * 查询对应字段详细数据
     * @param fieldId
     * @param companyCode
     * @return
     */
    IamUserTypeExtendedField getExtendInfo(@Param("fieldId")String fieldId,@Param("companyCode") String companyCode);

    /**
     * 校验扩展字段唯一性
     * @param fieldId
     * @param fieldData
     * @param companyCode
     * @return
     */
    int verifyIsSole(@Param("fieldId")String fieldId, @Param("fieldData")String fieldData, @Param("companyCode")String companyCode);

    /**
     * 校验是否修改数据
     * @param fieldId
     * @param userCode
     * @param companyCode
     * @return
     */
    String verifyFieldData(@Param("fieldId")String fieldId, @Param("userCode")String userCode, @Param("companyCode")String companyCode);

    /**
     * 删除扩展字段数据
     * @param userInfoDeleteDto
     */
    void deleteUserExtended(@Param("userInfoDeleteDto")UserInfoDeleteDto userInfoDeleteDto);

    /**
     * 功能描述：批量新增扩展字段
     * @param userTypeExtendeds
     */
    void batchInsertExtended(@Param("userTypeExtendeds") List<IamUserTypeExtended> userTypeExtendeds);

    /**
     * 功能描述：获取用户编码
     * @param companyCode
     * @param dataSource
     * @param phone
     * @return
     */
    String queryUserCode(@Param("companyCode") String companyCode, @Param("dataSource") String dataSource, @Param("phone") String phone);

    /**
     * 功能描述：根据userCode先批量删除扩展字段
     * @param userCode
     */
    void deleteExtendedByUserCode(@Param("userCode") String userCode);

    /**
     * 根据组织编码查询用户数据
     * @param orgCode
     * @param companyCode
     * @return
     */
    List<String> getOrgUserCodes(@Param("orgCode")String orgCode, @Param("companyCode")String companyCode);

    /**
     * 功能描述：查询动态用户组下的用户（分页展示）
     * @param：filterRules 筛选规则条件
     * @return PageInfo
     */
    List<IamUserInfo> queryDynamicUserGroupUserInfo(@Param("filterRules")List<IamUserGroupDynamicFilterRuleVo> filterRules,
                                                    @Param("companyCode")String companyCode);





    /**
     * 查询用户类型扩展字段是否可以全部为空
     * @param userTypeCode
     * @param companyCode
     * @return
     */
    int verifyAllNull(@Param("userTypeCode")String userTypeCode, @Param("companyCode")String companyCode);

    /**
     * 校验用户的用户类型数据
     * @param userInfoAddDto
     * @return
     */
    String verifyUserType(@Param("userInfoAddDto")UserInfoAddDto userInfoAddDto);

    /**
     * 校验填入的组织是否存在
     * @param orgCode
     * @param companyCode
     * @return
     */
    int verifyOrg(@Param("orgCode")String orgCode, @Param("companyCode")String companyCode);

    /**
     * 功能描述：账户中心——账号列表分页条件查询（普管）
     * @param iamQueryUserByOrgParam
     * @return PageInfo
     */
    List<String> queryAccountListRange(@Param("iamQueryUserByOrgParam") IamQueryUserByOrgParam iamQueryUserByOrgParam);

}
